home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / string / strmode.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  4KB  |  150 lines

  1. /*-
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #if defined(LIBC_SCCS) && !defined(lint)
  35. static char sccsid[] = "@(#)strmode.c    5.3 (Berkeley) 5/18/90";
  36. #endif /* LIBC_SCCS and not lint */
  37.  
  38. #include <sys/types.h>
  39. #include <sys/stat.h>
  40. #include <string.h>
  41.  
  42. void
  43. strmode(mode, p)
  44.     register mode_t mode;
  45.     register char *p;
  46. {
  47.      /* print type */
  48.     switch (mode & S_IFMT) {
  49.     case S_IFDIR:            /* directory */
  50.         *p++ = 'd';
  51.         break;
  52.     case S_IFCHR:            /* character special */
  53.         *p++ = 'c';
  54.         break;
  55.     case S_IFBLK:            /* block special */
  56.         *p++ = 'b';
  57.         break;
  58.     case S_IFREG:            /* regular */
  59.         *p++ = '-';
  60.         break;
  61.     case S_IFLNK:            /* symbolic link */
  62.         *p++ = 'l';
  63.         break;
  64. #ifdef S_IFSOCK
  65.     case S_IFSOCK:            /* socket */
  66.         *p++ = 's';
  67.         break;
  68. #endif
  69. #ifdef S_IFIFO
  70.     case S_IFIFO:            /* fifo */
  71.         *p++ = 'p';
  72.         break;
  73. #endif
  74.     default:            /* unknown */
  75.         *p++ = '?';
  76.         break;
  77.     }
  78.     /* usr */
  79.     if (mode & S_IRUSR)
  80.         *p++ = 'r';
  81.     else
  82.         *p++ = '-';
  83.     if (mode & S_IWUSR)
  84.         *p++ = 'w';
  85.     else
  86.         *p++ = '-';
  87.     switch (mode & (S_IXUSR | S_ISUID)) {
  88.     case 0:
  89.         *p++ = '-';
  90.         break;
  91.     case S_IXUSR:
  92.         *p++ = 'x';
  93.         break;
  94.     case S_ISUID:
  95.         *p++ = 'S';
  96.         break;
  97.     case S_IXUSR | S_ISUID:
  98.         *p++ = 's';
  99.         break;
  100.     }
  101.     /* group */
  102.     if (mode & S_IRGRP)
  103.         *p++ = 'r';
  104.     else
  105.         *p++ = '-';
  106.     if (mode & S_IWGRP)
  107.         *p++ = 'w';
  108.     else
  109.         *p++ = '-';
  110.     switch (mode & (S_IXGRP | S_ISGID)) {
  111.     case 0:
  112.         *p++ = '-';
  113.         break;
  114.     case S_IXGRP:
  115.         *p++ = 'x';
  116.         break;
  117.     case S_ISGID:
  118.         *p++ = 'S';
  119.         break;
  120.     case S_IXGRP | S_ISGID:
  121.         *p++ = 's';
  122.         break;
  123.     }
  124.     /* other */
  125.     if (mode & S_IROTH)
  126.         *p++ = 'r';
  127.     else
  128.         *p++ = '-';
  129.     if (mode & S_IWOTH)
  130.         *p++ = 'w';
  131.     else
  132.         *p++ = '-';
  133.     switch (mode & (S_IXOTH | S_ISVTX)) {
  134.     case 0:
  135.         *p++ = '-';
  136.         break;
  137.     case S_IXOTH:
  138.         *p++ = 'x';
  139.         break;
  140.     case S_ISVTX:
  141.         *p++ = 'T';
  142.         break;
  143.     case S_IXOTH | S_ISVTX:
  144.         *p++ = 't';
  145.         break;
  146.     }
  147.     *p++ = ' ';        /* will be a '+' if ACL's implemented */
  148.     *p = '\0';
  149. }
  150.